home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 15002 / 15002.xpi / chrome / content / script.js < prev    next >
Encoding:
JavaScript  |  2010-01-22  |  16.6 KB  |  468 lines

  1. var fastYoutubeDownloader = {};
  2.  
  3. fastYoutubeDownloader.initialize = function() 
  4. {
  5.     window.addEventListener("load", function() {
  6.         fastYoutubeDownloader.initExtensionPref();
  7.         fastYoutubeDownloader.setVer();
  8.         var iframe = document.createElement("browser");
  9.         iframe.setAttribute("width","100px");
  10.         iframe.setAttribute("height","100px");
  11.         iframe.setAttribute("flex","1");
  12.         iframe.setAttribute("disablehistory","true");
  13.         iframe.setAttribute("tooltip","aHTMLTooltip");
  14.         iframe.setAttribute("src","chrome://fastYoutubeDownloader/content/main.html");
  15.         document.getElementById("downloadBar").style.height = '0px';
  16.         fastYoutubeDownloader.iframe = iframe;
  17.         document.getElementById("downloadBar").appendChild(iframe);
  18.         window.document.addEventListener("DOMContentLoaded", fastYoutubeDownloader.contentLoadedSuccess, true)
  19.     }, false);
  20. }
  21. fastYoutubeDownloader.initExtensionPref = function() 
  22. {
  23.     var Console = Components.classes["@mozilla.org/fuel/application;1"].getService(Components.interfaces.fuelIApplication).console;
  24.     var Extension = Application.extensions.get("fastYoutubeDownloader@yevgenyandrov.net");
  25.     var p = Extension.prefs;
  26.  
  27.     fastYoutubeDownloader.p = {};
  28.     var a = fastYoutubeDownloader.p;
  29.  
  30.     a.fastYouTubeDownloadVersion = p.getValue("fastYouTubeDownloadVersion", "");
  31.     a.isFastYouTubeDownloadNew     = p.getValue("isFastYouTubeDownloadNew", true);
  32.  
  33.     a.useFirefoxDownloadManager = p.getValue("useFirefoxDownloadManager", false);
  34.     a.maximize                   = p.getValue("maximize", true);
  35.     a.displayFLVLink = p.getValue("flv", true);
  36.     a.display3GPLink = p.getValue("3gp", true);
  37.     a.displayMP4Link = p.getValue("mp4", true);
  38.     a.displayHDLink  = p.getValue("hd", true);
  39.     a.displayInSearchResults = p.getValue("displayInSearchResults", true);
  40.     a.displayInYoutubePage   = p.getValue("displayInYoutubePage", true);
  41.     a.displayInEmbed         = p.getValue("displayInEmbed", true);
  42. }
  43. fastYoutubeDownloader.addVideoDownloadItem = function(downloadItem) 
  44. {
  45.     if (fastYoutubeDownloader.p.maximize) {
  46.         document.getElementById("downloadBar").style.height = '62px';
  47.     } else {
  48.         document.getElementById("downloadBar").style.height = '43px';
  49.     }
  50.     fastYoutubeDownloader.addVideoDownload(downloadItem);
  51. }
  52. fastYoutubeDownloader.onDownloadItemsClear = function() 
  53. {
  54.     document.getElementById("downloadBar").style.height = '0px';
  55. }
  56. fastYoutubeDownloader.setHeight = function(_height) 
  57. {
  58.     document.getElementById("downloadBar").style.height = _height + 'px';
  59. }
  60. fastYoutubeDownloader.setVer = function() { 
  61.         try {
  62.               var nsIExtensionManager     = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager);
  63.               var fastYouTubeDownloadVersion     = nsIExtensionManager.getItemForID("fastYoutubeDownloader@yevgenyandrov.net").version;
  64.         } catch(ex) {
  65.         } finally  {
  66.               if (fastYoutubeDownloader.p.isFastYouTubeDownloadNew) {
  67.                  window.setTimeout(function(){
  68.                       var brs = getBrowser();
  69.                       brs.selectedTab = brs.addTab("http://www.fastyoutubedownload.com/1.1/?q=n");
  70.                  }, 1100);
  71.  
  72.                  var Console = Components.classes["@mozilla.org/fuel/application;1"].getService(Components.interfaces.fuelIApplication).console;
  73.                  var Extension = Application.extensions.get("fastYoutubeDownloader@yevgenyandrov.net");
  74.                  Extension.prefs.setValue("isFastYouTubeDownloadNew", false);
  75.                  Extension.prefs.setValue("fastYouTubeDownloadVersion", fastYouTubeDownloadVersion);
  76.               }    else {
  77.                  if (fastYoutubeDownloader.p.fastYouTubeDownloadVersion != fastYouTubeDownloadVersion){
  78.                     window.setTimeout(function(){
  79.                        var brs = getBrowser();
  80.                        brs.selectedTab = brs.addTab("http://www.fastyoutubedownload.com/1.1/?q=u");
  81.                     }, 1100);
  82.                     var Console = Components.classes["@mozilla.org/fuel/application;1"].getService(Components.interfaces.fuelIApplication).console;
  83.                     var Extension = Application.extensions.get("fastYoutubeDownloader@yevgenyandrov.net");
  84.                     Extension.prefs.setValue("fastYouTubeDownloadVersion", fastYouTubeDownloadVersion);
  85.                  }                
  86.               }
  87.         }
  88. }
  89. fastYoutubeDownloader.contentLoadedSuccess = function(event) 
  90. {
  91.     var doc = event.originalTarget;
  92.     if (fastYoutubeDownloader.isYoutubeVideoPage(doc))
  93.     {
  94.         fastYoutubeDownloader.setYoutubeDocument(doc);
  95.     }
  96.     if (fastYoutubeDownloader.p.displayInEmbed) fastYoutubeDownloader.checkEmbed(doc);
  97. }
  98. fastYoutubeDownloader.isYoutubeVideoPage = function(doc) 
  99. {
  100.     if (doc.location.href.match(/http:\/\/www(|[0-9])\.(|l\.)youtube\..*\/.*/i)) 
  101.     {
  102.         return true;
  103.     } else {
  104.         return false;
  105.     }
  106. }
  107. fastYoutubeDownloader.initPage = function(doc) 
  108. {
  109.     if (fastYoutubeDownloader.p.displayInSearchResults) {
  110.         var videos = doc.getElementsByClassName("video-cell");
  111.         if (videos) {
  112.             for (var i=0;i<videos.length;i++) 
  113.             {
  114.  
  115.                 var img = videos[i].getElementsByClassName("vimg120");
  116.                 var div = img[0].parentNode.parentNode.parentNode;
  117.                 var url = img[0].parentNode.href;
  118.  
  119.                 var div = videos[i].getElementsByClassName("video-main-content")[0];
  120.                 var videoId = div.id.substring(String("video-main-content-").length)
  121.                 
  122.                 
  123.                 var a = doc.createElement("div");
  124.                 a.innerHTML          = "Download: "
  125.                 a.style.cssFloat      = "left";
  126.                 a.style.marginLight = "1px";
  127.                 a.style.fontSize      = "11px";
  128.  
  129.                 div.appendChild(a);
  130.                 if (fastYoutubeDownloader.p.displayFLVLink) div.appendChild(fastYoutubeDownloader.createAbsoluteDownloadLink(doc, videoId, "FLV"));
  131.                 if (fastYoutubeDownloader.p.displayMP4Link) div.appendChild(fastYoutubeDownloader.createAbsoluteDownloadLink(doc, videoId, "MP4"));
  132.                 if (fastYoutubeDownloader.p.display3GPLink) div.appendChild(fastYoutubeDownloader.createAbsoluteDownloadLink(doc, videoId, "3GP"));
  133.             }
  134.         }
  135.     }
  136. }
  137. fastYoutubeDownloader.checkEmbed = function(doc) 
  138. {
  139.     var addLinks = function(obj, isObject)
  140.     {
  141.         if (isObject) 
  142.         {
  143.             for (var j=0;j<obj.childNodes.length;j++) 
  144.             {
  145.                 if (obj.childNodes[j].getAttribute) 
  146.                 {
  147.                     if (obj.childNodes[j].getAttribute("name")) 
  148.                     {
  149.                         if ((obj.childNodes[j].getAttribute("name").toLowerCase()=="movie") || (obj.childNodes[j].getAttribute("name").toLowerCase()=="src")) 
  150.                         {
  151.                             var src = obj.childNodes[j].getAttribute("value");
  152.                         }
  153.                     }
  154.                 }
  155.             }
  156.             var container = obj;
  157.             if (obj.checkd) return;
  158.         } else {
  159.             if (obj.parentNode instanceof HTMLObjectElement) {
  160.                 for (var j=0;j<obj.parentNode.childNodes.length;j++) 
  161.                 {
  162.                     if (obj.parentNode.childNodes[j].getAttribute) 
  163.                     {
  164.                         if (obj.parentNode.childNodes[j].getAttribute("name")) 
  165.                         {
  166.                             if ((obj.parentNode.childNodes[j].getAttribute("name").toLowerCase()=="movie") || (obj.parentNode.childNodes[j].getAttribute("name").toLowerCase()=="src")) 
  167.                             {
  168.                                 var src = obj.parentNode.childNodes[j].getAttribute("value");
  169.                             }
  170.                         }
  171.                     }
  172.                 }
  173.                 var container = obj.parentNode;
  174.                 obj.parentNode.checkd = true;
  175.  
  176.             } else 
  177.             {
  178.                 var src = obj.getAttribute("src");
  179.                 var container = obj;
  180.                 if (obj.checkd) return;
  181.             }
  182.         }
  183.         obj.checkd = true;
  184.  
  185.         if (src.indexOf("www.youtube.com/v")!=-1) 
  186.         {
  187.             var div = doc.createElement("div");
  188.             div.style.marginTop = "3px";
  189.             container.parentNode.appendChild(div);
  190.  
  191.             var posA = src.indexOf(".com/v/") + 7;
  192.             var posB = src.indexOf("&", posA);
  193.             if (posB!=-1) 
  194.             {
  195.                 var videoId = src.substring(posA, posB);
  196.             } else {
  197.                 var posB = src.indexOf("%26", posA);
  198.                 if (posB!=-1) 
  199.                 {
  200.                     var videoId = src.substring(posA, posB);
  201.                 } else 
  202.                 {
  203.                     var videoId = src.substring(posA);
  204.                 }
  205.             }
  206.             var a = doc.createElement("div");
  207.             a.innerHTML            = "Download: "
  208.             a.style.marginLight = "1px";
  209.             a.style.fontSize    = "11px";
  210.             div.appendChild(a);
  211.  
  212.             if (fastYoutubeDownloader.p.displayFLVLink) div.appendChild(fastYoutubeDownloader.createAbsoluteDownloadLink(doc, videoId, "FLV"));
  213.             if (fastYoutubeDownloader.p.displayMP4Link) div.appendChild(fastYoutubeDownloader.createAbsoluteDownloadLink(doc, videoId, "MP4"));
  214.             if (fastYoutubeDownloader.p.display3GPLink) div.appendChild(fastYoutubeDownloader.createAbsoluteDownloadLink(doc, videoId, "3GP"));
  215.         }
  216.     }
  217.     var embed = doc.getElementsByTagName("embed");
  218.     for (var i=0;i<embed.length;i++) 
  219.     {
  220.         addLinks(embed[i], false);
  221.     }
  222.  
  223.     var objects = doc.getElementsByTagName("object");
  224.     for (var i=0;i<objects.length;i++) 
  225.     {
  226.         addLinks(objects[i], true);
  227.     }
  228. }
  229. fastYoutubeDownloader.setYoutubeDocument = function(doc) 
  230. {
  231.     fastYoutubeDownloader.initPage(doc);
  232.     if (fastYoutubeDownloader.p.displayInYoutubePage) {
  233.         doc.videoId = fastYoutubeDownloader.getQuery(doc, "v");
  234.         if (doc.videoId!=null) 
  235.         {
  236.             doc.videoTitle   = doc.title.replace(/youtube - /gi, "")
  237.             var linksForDownload = doc.createElement("div");
  238.             var youtubeCon    = doc.getElementById("watch-channel-vids-div");;
  239.             youtubeCon.appendChild(linksForDownload);
  240.  
  241.             linksForDownload.style.marginTop = "4px";
  242.             linksForDownload.style.marginBottom = "3px";
  243.             linksForDownload.style.marginLeft = "55px";
  244.             var div = doc.createElement("div");
  245.             div.innerHTML          = "Download: "
  246.             div.style.cssFloat      = "left";
  247.             div.style.fontSize      = "11px";
  248.  
  249.             linksForDownload.appendChild(div);
  250.  
  251.             if (fastYoutubeDownloader.p.displayFLVLink) linksForDownload.appendChild(fastYoutubeDownloader.createDownloadLink(doc, "FLV"));
  252.             if (fastYoutubeDownloader.p.displayMP4Link) linksForDownload.appendChild(fastYoutubeDownloader.createDownloadLink(doc, "MP4"));
  253.             if (fastYoutubeDownloader.p.display3GPLink) linksForDownload.appendChild(fastYoutubeDownloader.createDownloadLink(doc, "3GP"));
  254.  
  255.             try 
  256.             {
  257.                 var youtubeFlashPlayer = doc.getElementById('movie_player');
  258.                 if (youtubeFlashPlayer!=null) 
  259.                 {
  260.                     var flashvars = youtubeFlashPlayer.attributes.getNamedItem('flashvars');  
  261.                     if (flashvars!=null) 
  262.                     {
  263.                         if (flashvars.value.indexOf("fmt_map=22")!=-1) 
  264.                         {
  265.                             if (fastYoutubeDownloader.p.displayHDLink) linksForDownload.appendChild(fastYoutubeDownloader.createDownloadLink(doc, "HD"));
  266.                         }
  267.                     }
  268.                 }
  269.             } catch(ex) 
  270.             {
  271.             }
  272.         }
  273.     }
  274. }
  275.  
  276.  
  277. fastYoutubeDownloader.getQuery = function(doc, param)
  278. {
  279.     var getParams = function(str, param) {
  280.         var list = str.split("&");
  281.         for (i=0;i<list.length;i++) 
  282.         {
  283.             var p = list[i].split("=");
  284.             if (p[0] == param) 
  285.             {
  286.                 return p[1];
  287.             }
  288.         }    
  289.     }
  290.     var keyword = getParams(doc.location.search.substring(1), param);    
  291.  
  292.     if ((keyword=="") || (keyword==null)) 
  293.     {
  294.         keyword = getParams(doc.location.hash, param);    
  295.     }    
  296.     return keyword;
  297. }
  298.  
  299. fastYoutubeDownloader.createAbsoluteDownloadLink = function(doc, videoId, videoFormat) 
  300. {
  301.     var downloadLink = doc.createElement("a");
  302.     downloadLink.setAttribute("href", "#")
  303.     downloadLink.setAttribute("onclick", "return false");
  304.     downloadLink.style.marginLeft = "4px"
  305.     downloadLink.style.fontSize = "11px";
  306.     downloadLink.videoId = videoId
  307.     downloadLink.videoFormat = videoFormat;
  308.     downloadLink.innerHTML   = videoFormat;
  309.     downloadLink.addEventListener("click",function(e) 
  310.     { 
  311.         var videoId     = e.currentTarget.videoId;
  312.         var videoFormat = e.currentTarget.videoFormat;
  313.         fastYoutubeDownloader.getYoutubePage(videoId, videoFormat);
  314.     },false);
  315.     return downloadLink;
  316. }
  317. fastYoutubeDownloader.createDownloadLink = function(doc, videoFormat) 
  318. {
  319.     var downloadLink = doc.createElement("a");
  320.     downloadLink.setAttribute("href", "#")
  321.     downloadLink.setAttribute("onclick", "return false");
  322.     downloadLink.style.marginLeft = "4px"
  323.     downloadLink.style.fontSize = "11px";
  324.     downloadLink.doc = doc
  325.     downloadLink.videoFormat = videoFormat;
  326.     downloadLink.innerHTML   = videoFormat;
  327.     downloadLink.addEventListener("click",function(e) 
  328.     { 
  329.         var videoId     = e.currentTarget.doc.videoId;
  330.         var doc            = e.currentTarget.doc;
  331.         var videoFormat = e.currentTarget.videoFormat;
  332.  
  333.         var innerHTML = doc.getElementsByTagName("html")[0].innerHTML;
  334.         var key = innerHTML.match(/\&t=[\w-]{10,}/ig)
  335.         var youtubeFlashPlayer = doc.getElementById('movie_player');
  336.         if (youtubeFlashPlayer) 
  337.         {
  338.             var flashvars = youtubeFlashPlayer.attributes.getNamedItem('flashvars');  
  339.             if (flashvars!=null) 
  340.             {
  341.                 var key = flashvars.value.match(/\&t=[\w-]{10,}/ig)
  342.                 if (key.length>0) key = key[0]
  343.                 key += "=";
  344.             } else {
  345.                 return;
  346.             }
  347.         }
  348.         switch (videoFormat.toUpperCase()) {
  349.             case "HD":
  350.                 var downloadURL = "http://youtube.com/get_video?video_id="+videoId+"&"+key+"&fmt=22"    
  351.                 fastYoutubeDownloader.downloadVideo(doc.videoTitle, downloadURL, "mp4", videoId);
  352.                 return;
  353.                 break;
  354.             case "MP4":
  355.                 var downloadURL = "http://youtube.com/get_video?video_id="+videoId+"&"+key+"&fmt=18"
  356.                 break;
  357.             case "3GP":
  358.                 var downloadURL = "http://youtube.com/get_video?video_id="+videoId+"&"+key+"&fmt=17"
  359.                 break;
  360.             default:
  361.                 var downloadURL = "http://youtube.com/get_video?video_id="+videoId+"&"+key
  362.         }
  363.         fastYoutubeDownloader.downloadVideo(doc.videoTitle, downloadURL, videoFormat, videoId);
  364.     },false);
  365.     return downloadLink;
  366. }
  367.  
  368. fastYoutubeDownloader.getYoutubePage = function(videoId, videoFormat) 
  369. {
  370.     
  371.     var url = "http://www.youtube.com/watch?v=" + videoId;
  372.     var xmlHttpRequest;
  373.     if (window.XMLHttpRequest) {
  374.         xmlHttpRequest = new XMLHttpRequest();
  375.     } else if (window.ActiveXObject) {
  376.         xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  377.     }
  378.     xmlHttpRequest.open("GET", url, true);
  379.     xmlHttpRequest.onreadystatechange =  function () {
  380.         if (xmlHttpRequest.readyState == 4) {
  381.             if (xmlHttpRequest.status == 200) {
  382.             var posA = xmlHttpRequest.responseText.indexOf("\"t\":") + 6;
  383.             var posB = xmlHttpRequest.responseText.indexOf("\",", posA);
  384.             var key  = xmlHttpRequest.responseText.substring(posA, posB - 3);
  385.  
  386.             var title = "Video";
  387.             posA = xmlHttpRequest.responseText.indexOf("<title>")
  388.             posB = xmlHttpRequest.responseText.indexOf("</title>")
  389.             if ((posA!=-1) && (posB!=-1))
  390.             {
  391.                 title = xmlHttpRequest.responseText.substr(posA + String("<title>").length, posB - posA - String("</title>").length + 1)
  392.                 title = title.replace(/youtube - /gi, "")
  393.             }
  394.             key = "t=" + key + "=";
  395.             switch (videoFormat.toUpperCase()) {
  396.                 case "HD":
  397.                     var downloadURL = "http://youtube.com/get_video?video_id="+videoId+"&"+key+"&fmt=22"    
  398.                     fastYoutubeDownloader.downloadVideo(title, downloadURL, "mp4", videoId);
  399.                     return;
  400.                     break;
  401.                 case "MP4":
  402.                     var downloadURL = "http://youtube.com/get_video?video_id="+videoId+"&"+key+"&fmt=18"
  403.                     break;
  404.                 case "3GP":
  405.                     var downloadURL = "http://youtube.com/get_video?video_id="+videoId+"&"+key+"&fmt=17"
  406.                     break;
  407.                 default:
  408.                     var downloadURL = "http://youtube.com/get_video?video_id="+videoId+"&"+key
  409.             }
  410.             fastYoutubeDownloader.downloadVideo(title, downloadURL, videoFormat, videoId);
  411.             }
  412.         }
  413.     };
  414.     xmlHttpRequest.send("");
  415. }
  416. fastYoutubeDownloader.downloadVideo = function(videoTitle,downloadURL,format, videoId) 
  417. {
  418.     if (format.toLowerCase()=="hd") videoTitle += "_hd";
  419.     var destinationFile    = fastYoutubeDownloader.openFilePicker(videoTitle+"."+format, format);
  420.     if (!fastYoutubeDownloader.p.useFirefoxDownloadManager) {
  421.           videoDownloadItem = {
  422.               title           : videoTitle,
  423.               downloadURL  : downloadURL,
  424.               videoId      : videoId,
  425.               thumbnailURL : "http://i2.ytimg.com/vi/" + videoId + "/default.jpg",
  426.               path         : destinationFile.path,
  427.               folder       : destinationFile.folder
  428.           };
  429.           fastYoutubeDownloader.addVideoDownloadItem(videoDownloadItem);
  430.           return;
  431.     }
  432.  
  433.     var persist = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
  434.                  .createInstance(Components.interfaces.nsIWebBrowserPersist);  
  435.     var xfer    = Components.classes["@mozilla.org/transfer;1"]
  436.                 .createInstance(Components.interfaces.nsITransfer);  
  437.     var ios     = Components.classes['@mozilla.org/network/io-service;1']
  438.                  .getService(Components.interfaces.nsIIOService);  
  439.     var uri     = ios.newURI(downloadURL, null, null); 
  440.     var target  = ios.newFileURI(destinationFile.file);
  441.     xfer.init(uri, target, "", null, null, null, persist);  
  442.     persist.progressListener = xfer; 
  443.     persist.saveURI(uri, null, null, null, null, destinationFile.file);
  444.  
  445.     
  446. }
  447.  
  448. fastYoutubeDownloader.openFilePicker = function(fileName,format) 
  449. {
  450.     var nsIFilePicker = Components.interfaces.nsIFilePicker;
  451.     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  452.     fp.init(window, "Save As", nsIFilePicker.modeSave);
  453.     fp.appendFilter(format, "*."+ format);
  454.     fp.defaultString = fileName;
  455.     var rv = fp.show();
  456.     if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) 
  457.     {
  458.     //  return fp.file;
  459.       return {
  460.           file    : fp.file,
  461.           path    : fp.file.path,
  462.           folder  : fp.displayDirectory.path
  463.       }
  464.     }
  465.     return;
  466. }
  467.  
  468. fastYoutubeDownloader.initialize();